home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / wtek0693.zip / OOPALLEY.ZIP / ARRAYOB.CPP < prev    next >
C/C++ Source or Header  |  1993-04-27  |  4KB  |  154 lines

  1. #include <stdlib.h>  // prototype for qsort
  2. #include "arrayob.h"
  3.  
  4. inline Object** REALLOC(Object** ptr, unsigned size)
  5. {
  6.     return (Object**)realloc((char*)ptr,sizeof(Object*)*size);
  7. }
  8.  
  9. inline void DELETE(Object** ptr) { free((char*)ptr); }
  10.  
  11.  
  12. #define THIS    ArrayOb
  13. #define BASE    Collection
  14. //DEFINE_CLASS(THIS, BASE);
  15. DEFINE_CLASS(ArrayOb,Collection);
  16.  
  17. #define NEW(type,size)  ((type*)malloc(sizeof(type)*(size)))
  18.  
  19. ArrayOb::ArrayOb(unsigned size)
  20. {
  21.     sz = size;
  22.     if (sz==0) allocSizeErr();
  23.     v = NEW(Object*,sz);
  24.     register i = sz;
  25.     register Object** vp = &v[0];
  26.     while (i--) *vp++ = (Object*)nil;
  27. }
  28.     
  29. ArrayOb::ArrayOb(const ArrayOb& a)
  30. {
  31.     register i = a.sz;
  32.     sz = i;
  33.     v = NEW(Object*,i);
  34.     register Object** vp = &v[0];
  35.     register Object** av = &a.v[0];
  36.     while (i--) *vp++ = *av++;
  37. }
  38.  
  39. ArrayOb::~ArrayOb() { DELETE(v); }
  40.  
  41. void ArrayOb::operator=(const ArrayOb& a)
  42. {
  43.     if (v != a.v) {
  44.         DELETE(v);
  45.         v = NEW(Object*,sz=a.sz);
  46.         register i = a.sz;
  47.         register Object** vp = &v[0];
  48.         register Object** av = &a.v[0];
  49.         while (i--) *vp++ = *av++;
  50.     }
  51. }
  52.  
  53. bool ArrayOb::operator==(const ArrayOb& a) const
  54. {
  55.     if (sz != a.sz) return NO;
  56.     register unsigned i = sz;
  57.     register Object** vp = &v[0];
  58.     register Object** av = &a.v[0];
  59.     while (i--) { if (!((*vp++)->isEqual(**av++))) return NO; }
  60.     return YES;
  61. }
  62.  
  63. Object*& ArrayOb::at(int i) const { return (*this)[i]; }
  64.  
  65. unsigned ArrayOb::capacity() const    { return sz; }
  66.     
  67. bool ArrayOb::isEqual(const Object& a) const
  68. {
  69.     return a.isSpecies(class_ArrayOb) && *this==*(ArrayOb*)&a;
  70. }
  71.  
  72. const Class* ArrayOb::species() const { return &class_ArrayOb; }
  73.  
  74. void ArrayOb::reSize(unsigned newsize)
  75. {
  76.     if (newsize<=0) allocSizeErr();
  77.     v = REALLOC(v,newsize);
  78.     sz = newsize;
  79. }
  80.  
  81. Collection& ArrayOb::addContentsTo(Collection& cltn) const
  82. {
  83.     register Object** vp = &v[0];
  84.     register unsigned i = sz;
  85.     while (i--) cltn.add(**vp++);
  86.     return cltn;
  87. }
  88.  
  89. Object* ArrayOb::doNext(Iterator& pos) const
  90. {
  91.     if (pos.index < size()) return v[pos.index++];
  92.     return 0;
  93. }
  94.  
  95. void ArrayOb::deepenShallowCopy()
  96. {
  97.     BASE::deepenShallowCopy();
  98.     register Object** av = &v[0];
  99.     register i = sz;
  100.     v = NEW(Object*,i);
  101.     register Object** vp = &v[0];
  102.     while (i--) *vp++ = (*av++)->deepCopy();
  103. }
  104.  
  105. unsigned ArrayOb::hash() const
  106. {
  107.     register unsigned h = sz;
  108.     register unsigned i = sz;
  109.     register Object** vp = &v[0];
  110.     while (i--) h^=(*vp++)->hash();
  111.     return h;
  112. }
  113.  
  114. void ArrayOb::printOn(ostream& strm) const
  115. {
  116.     strm << className() << "[\n";
  117.     for (register unsigned i=0; i<sz; i++) {
  118.         if (i>0) strm << "\n";
  119.         v[i]->printOn(strm);
  120.     }
  121.     strm << "]\n";
  122. }
  123.  
  124.  
  125. unsigned ArrayOb::size() const    { return sz; }
  126.  
  127. static int
  128. compare_ob(Object** a, Object** b) // const
  129. {
  130.     return (*a)->compare(**b);
  131. }
  132.  
  133. void ArrayOb::sort() const
  134. {
  135.     //qsort(&v[0],sz,sizeof(Object*),compare_ob);
  136.     // -gmv 2/14/90 added cast
  137.     qsort(&v[0],sz,sizeof(Object*),
  138.     (int (*)(const void*, const void*))compare_ob);
  139. }
  140.  
  141. void ArrayOb::allocSizeErr() const
  142. {
  143.     //DTerror("OOPS_ALLOCSIZE,DEFAULT,this",className());
  144.     DTerror("Negative or zero object allocation size requested: ",className());
  145. }
  146.  
  147. void ArrayOb::indexRangeErr() const
  148. {
  149.     //DTerror("OOPS_INDEXRANGE,DEFAULT,this",className());
  150.     DTerror("Index out of range: ",className());
  151. }
  152.  
  153.  
  154.